package indexador;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.IntField;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

public class Indexador {	
	
	public static final String SEPARATOR = System.getProperty("file.separator");
		
	private String diretorioDosIndices = System.getProperty("user.dir")
			+ SEPARATOR +"indice-lucene";

	private IndexWriter writer;
	
	private static Indexador instance;
	
	private static List<String> chavesUrl = new ArrayList<String>();
	
	private Indexador() {
		
	}
	
	public static Indexador getInstance() {
		if (null == instance) {
			instance = new Indexador();
		}
		return instance;
	}
	
	public List<String> getChavesUrl() {
		return chavesUrl;
	}
	
	public void abrirIndice() {
		File diretorio = new File(diretorioDosIndices);

		try {			
			FSDirectory d = FSDirectory.open(diretorio);			
			
			Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_43);
			IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_43, analyzer);
			config.setRAMBufferSizeMB(200);
			config.setMaxBufferedDocs(200);

			writer = new IndexWriter(d, config);
			
			File arquivo = new File(System.getProperty("user.dir")+SEPARATOR+"chavesUrl.txt");
			BufferedReader arquivoBufferizado = new BufferedReader(new InputStreamReader(new FileInputStream(arquivo), "UTF-8"));
			String texto = "";
			while (arquivoBufferizado.ready()) {
				texto = texto + arquivoBufferizado.readLine();
			}
			arquivoBufferizado.close();			
			List<String> lista = Arrays.asList(texto.split(",")); 
			chavesUrl.addAll(lista);
			arquivoBufferizado.close();

		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void comitarAlteracao() {
		try {
			writer.commit();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void fecharIndice() {
		try {
			writer.commit();
			writer.close();
			
			File arquivo = new File(System.getProperty("user.dir") + SEPARATOR + "chavesUrl.txt");
			BufferedWriter texto = new BufferedWriter(new FileWriter(arquivo));
			
			StringBuffer msg = new StringBuffer();
			
			for (String chave : chavesUrl) {				
				msg.append(chave + ",");
			}
			
			texto.write(msg.toString());
			texto.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public Document novoDocumento() {
		return new Document();
	}
	
	public void adicionarDocumento(Document doc) {
		try {
			writer.addDocument(doc);
		} catch (IOException e) {
			fecharIndice();
			e.printStackTrace();
		}
	}	
	
	public void atualizarIndice(Document doc, String nomeCampo, String texto, Integer tipoCampo, Float peso) {
		switch (tipoCampo) {
			case 1:
				StringField campoString = new StringField(nomeCampo, texto, Store.YES);
				//campoString.setBoost(peso);
				doc.add(campoString);
				if (nomeCampo.equals("url")) {
					chavesUrl.add(texto.substring(texto.indexOf("v=")+2));
				}
				break;
			case 2:
				IntField campoInt = new IntField(nomeCampo, Integer.parseInt(texto), Store.YES);
				//campoInt.setBoost(peso);
				doc.add(campoInt);
				break;
			case 3:
				TextField campoText = new TextField(nomeCampo, texto, Store.YES);
				//campoText.setBoost(peso);
				doc.add(campoText);
				break;
		}
	}	

	public void apagaIndices(File diretorio) {
		if (diretorio.exists()) {
			File arquivos[] = diretorio.listFiles();
			for (File arquivo : arquivos) {
				arquivo.delete();
			}
		}
	}
	
	public List<String> recuperarListaStopwords() throws IOException {
		File stopwords = new File(diretorioDosIndices + SEPARATOR + "stopwords.txt");
		BufferedReader arquivoBufferizado = new BufferedReader(new InputStreamReader(new FileInputStream(stopwords), "UTF-8"));
		String linha;
		linha = arquivoBufferizado.readLine();
		List<String> listaStopwords = new ArrayList<String>();
		
		while(arquivoBufferizado.ready()) {
			listaStopwords.add(linha);
			linha = arquivoBufferizado.readLine();
		}
		arquivoBufferizado.close();
		return listaStopwords;
	}
}